package com.huitong.admin.system.service.impl;

import com.huitong.admin.system.domain.dto.MajorDTO;
import com.huitong.admin.system.domain.dto.MajorPageDTO;
import com.huitong.admin.system.domain.po.MajorPO;
import com.huitong.admin.system.domain.vo.MajorVO;
import com.huitong.admin.system.mapper.MajorMapper;
import com.huitong.admin.system.service.MajorService;
import com.huitong.common.core.domain.Result;
import com.huitong.common.mybatis.constant.TableConstant;
import com.huitong.common.mybatis.domain.PageResult;
import com.huitong.common.mybatis.utils.PageUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static com.huitong.common.redis.constant.CacheConstant.MAJOR_KEY_NAME;

/**
 * 专业信息服务层
 *
 * @author fromdrowning
 * @date 2024/5/2 上午11:53
 */
@RequiredArgsConstructor
@Service
public class MajorServiceImpl implements MajorService {

    /**
     * 专业信息数据访问层
     */
    private final MajorMapper majorMapper;

    /**
     * 新增专业信息
     *
     * @param majorDTO 专业信息
     */
    @CacheEvict(cacheNames = MAJOR_KEY_NAME)
    @Override
    public void insertMajor(MajorDTO majorDTO) {
        MajorPO majorPO = new MajorPO();
        BeanUtils.copyProperties(majorDTO, majorPO);
        majorMapper.insertMajor(majorPO);
    }

    /**
     * 查询专业信息
     *
     * @param id 专业号
     * @return 专业信息
     */
    @Override
    public Result<MajorVO> selectMajor(Integer id) {
        return Result.success(majorMapper.selectMajor(id));
    }

    /**
     * 查询专业信息
     *
     * @param collegeId 学院号
     * @return 专业信息
     */
    @Cacheable(cacheNames = MAJOR_KEY_NAME)
    @Override
    public Result<List<MajorVO>> selectMajorList(Integer collegeId) {
        return Result.success(majorMapper.selectMajorList(collegeId));
    }

    /**
     * 查询专业信息
     *
     * @param majorPageDTO 分页信息
     * @return 分页信息
     */
    @Override
    public PageResult<MajorVO> pageMajor(MajorPageDTO majorPageDTO) {
        PageUtils.startPage(majorPageDTO, TableConstant.MAJOR_TABLE);
        return PageResult.success(majorMapper.pageMajor(majorPageDTO));
    }

    /**
     * 修改专业信息
     *
     * @param majorDTO 专业信息
     */
    @CacheEvict(cacheNames = MAJOR_KEY_NAME)
    @Override
    public void updateMajor(MajorDTO majorDTO) {
        MajorPO majorPO = new MajorPO();
        BeanUtils.copyProperties(majorDTO, majorPO);
        majorMapper.updateMajor(majorPO);
    }

    /**
     * 删除专业信息
     *
     * @param id 专业号
     */
    @CacheEvict(cacheNames = MAJOR_KEY_NAME)
    @Transactional
    @Override
    public void deleteMajor(Integer id) {
        majorMapper.insertMajorDeleted(id);
        majorMapper.deleteMajor(id);
        // TODO 删除专业信息时 还需要删除与专业相关的信息
    }
}
